/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package amanda_gabriel_isabella_lucivania_monica.Model.Pojo;

import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;

/**
 * Entidade Disciplina
 *
 * @author isabella
 */
@Entity
@Table(name = "Disciplina")
@PrimaryKeyJoinColumn(name = "fk_id_disciplina", referencedColumnName = "id_disciplina")
public class Disciplina implements Serializable {

    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_disciplina", unique = true, nullable = false)
    private int id;
    private String nome;
    private String ementa;
    private int cargaHoraria;
    private int numeroTurmasOferecidas;
    @OneToMany(mappedBy = "disciplina")
    private List<Turma> turma;
    @OneToMany(mappedBy = "disciplina")
    private List<HistoricoDisciplina> historicoDisciplina;

    /**
     * Construtor sem parâmetros de Disciplina
     */
    public Disciplina() {
    }

    /**
     * Construtor da disciplina sem id com relacionamentos
     *
     * @param nome
     * @param ementa
     * @param cargaHoraria
     */
    public Disciplina(String nome, String ementa, int cargaHoraria) {
        this.nome = nome;
        this.ementa = ementa;
        this.cargaHoraria = cargaHoraria;
    }

    /**
     * Retorna o Id da Disciplina
     *
     * @return
     */
    public int getId() {
        return id;
    }

    /**
     * Seta o Id da Disciplina
     *
     * @param id
     */
    public void setId(int id) {
        int oldId = this.id;
        this.id = id;
        changeSupport.firePropertyChange("id", oldId, id);
    }

    /**
     * Retorna a cargaHoraria da Disciplina
     *
     * @return
     */
    public int getCargaHoraria() {
        return cargaHoraria;
    }

    /**
     * Seta a cargaHoraria da Disciplina
     *
     * @param cargaHoraria
     */
    public void setCargaHoraria(int cargaHoraria) {
        int oldCargaHoraria = this.cargaHoraria;
        this.cargaHoraria = cargaHoraria;
        changeSupport.firePropertyChange("cargaHoraria", oldCargaHoraria, cargaHoraria);
    }

    /**
     * Retorna a ementa da Disciplina
     *
     * @return
     */
    public String getEmenta() {
        return ementa;
    }

    /**
     * Seta a ementa da Disciplina
     *
     * @param ementa
     */
    public void setEmenta(String ementa) {
        String oldEmenta = this.ementa;
        this.ementa = ementa;
        changeSupport.firePropertyChange("ementa", oldEmenta, ementa);
    }

    /**
     * Retorna uma lista de HistoricoDisciplina
     *
     * @return
     */
    public List<HistoricoDisciplina> getHistoricoDisciplina() {
        return historicoDisciplina;
    }

    /**
     * Seta uma lista de HistoricoDisciplina
     *
     * @param historicoDisciplina
     */
    public void setHistoricoDisciplina(List<HistoricoDisciplina> historicoDisciplina) {
        this.historicoDisciplina = historicoDisciplina;
    }

    /**
     * Retorna o nome da Disciplina
     *
     * @return
     */
    public String getNome() {
        return nome;
    }

    /**
     * Seta o nome da Disciplina
     *
     * @param nome
     */
    public void setNome(String nome) {
        String oldNome = this.nome;
        this.nome = nome;
        changeSupport.firePropertyChange("nome", oldNome, nome);
    }

    /**
     * Retorna o número de turmas oferecidas pela Disciplina
     *
     * @return
     */
    public int getNumeroTurmasOferecidas() {
        return numeroTurmasOferecidas;
    }

    /**
     * Seta o número de turmas oferecidas pela Disciplina
     *
     * @param numeroTurmasOferecidas
     */
    public void setNumeroTurmasOferecidas() {
        this.numeroTurmasOferecidas = numeroTurmasOferecidas++;
    }

    /**
     * Retorna a turma referente à Disciplina
     *
     * @return
     */
    public List<Turma> getTurma() {
        return turma;
    }

    /**
     * Seta a turma referente à Disciplina
     *
     * @param turma
     */
    public void setTurma(List<Turma> turma) {
        this.turma = turma;
    }

    /**
     * Retorna uma String contendo informações gerais de Disciplina
     *
     * @return
     */
    @Override
    public String toString() {
        return ("Nome: " + this.getNome() + "      Carga Horaria: " + this.getCargaHoraria());
    }
}
